//
//  IMIDIDevManager.h
//  IMIDIDevManager
//  管理 MIDI source 的链接与断开
//  Created by 张宇飞 on 2020/11/30.
//  Copyright © 2020 元悦科技. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <MIKMIDI/MIKMIDICommand.h>

NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSInteger, IMIDIDevManagerEventType) {
    kIMIDIDevManagerEvent_SourceConncted,     // 已链接
    kIMIDIDevManagerEvent_SourceDisconncted,  // 断开链接
    kIMIDIDevManagerEvent_MIDICommands        // 收到 MIDI 数据
};

// kIMIDIDevManagerEvent_SourceConncted, NSString* (source point display name)
// kIMIDIDevManagerEvent_SourceDisconncted, NSString* (source point display name)
// kIMIDIDevManagerEvent_MIDICommands, NSArray<MIKMIDICommand*>* (midi 数据)
typedef void (^IMIDIDevManagerEventHandler)(IMIDIDevManagerEventType eventType, id _Nonnull data);

/**
 * IMIDIDevManager 用于管理 source point 的链接与断开
 */
@interface IMIDIDevManager : NSObject

// 单例
@property(class, readonly, strong) IMIDIDevManager *defaultManager;

// 是否已经有 MIDI source point 被链接了
@property(nonatomic, readonly) BOOL isSourceConnected;

/**
 * 控制和获取运行状态。默认为 NO
 * set YES 表示恢复运行监控，并尝试链接第一个可用的 MIDI 设备。应在应用 applicationDidBecomeActive
 * 中赋值 YES set NO 表示暂停 MIDI 设备监控，并断开已经链接的设备。应在应用
 * applicationWillResignActive 中赋值 NO
 */
@property(nonatomic, readwrite) BOOL running;

/**
 * 显示 BLE MIDI 设备连接断开与管理列表。这里会显示系统提供的控制列表 view，在点击 Done
 * 的时候尝试连接第一个可用的 MIDI 设备
 */
- (void)showBLEListView;

/**
 * 添加 MIDI 事件监听。事件被通知的时候发生在非主线程。（该接口线程安全）
 */
- (void)addEventHandler:(nonnull IMIDIDevManagerEventHandler)handler;

/**
 * 移除 MIDI 事件监听（该接口线程安全）
 */
- (void)removeEventHandler:(nonnull IMIDIDevManagerEventHandler)handler;

@end

NS_ASSUME_NONNULL_END
